From 798b620c2d2190846191aa90c3ab91999a7ed79f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 22 Oct 2014 22:14:23 -0700 Subject: [PATCH] Make it easier to map dependencies in a summary This will hopefully become useful in the upcoming changes to resolve for lockfiles with the registry. --- src/cargo/core/dependency.rs | 12 ++++++++++++ src/cargo/core/source.rs | 12 ++++-------- src/cargo/core/summary.rs | 10 +++++++++- src/cargo/ops/cargo_generate_lockfile.rs | 2 +- src/cargo/ops/cargo_package.rs | 20 ++++++-------------- src/cargo/sources/git/source.rs | 2 +- 6 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index cd0d81939..b57a3431b 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -100,6 +100,18 @@ impl Dependency { self } + /// Set the source id for this dependency + pub fn source_id(mut self, id: SourceId) -> Dependency { + self.source_id = id; + self + } + + /// Set the version requirement for this dependency + pub fn version_req(mut self, req: VersionReq) -> Dependency { + self.req = req; + self + } + /// Returns false if the dependency is only used to build the local package. pub fn is_transitive(&self) -> bool { self.transitive } pub fn is_optional(&self) -> bool { self.optional } diff --git a/src/cargo/core/source.rs b/src/cargo/core/source.rs index 9644403ea..15a9e5ae4 100644 --- a/src/cargo/core/source.rs +++ b/src/cargo/core/source.rs @@ -157,12 +157,8 @@ impl SourceId { } pub fn for_git(url: &Url, reference: &str, precise: Option) -> SourceId { - let mut id = SourceId::new(GitKind(reference.to_string()), url.clone()); - if precise.is_some() { - id = id.with_precise(precise.unwrap()); - } - - id + SourceId::new(GitKind(reference.to_string()), url.clone()) + .with_precise(precise) } pub fn for_registry(url: &Url) -> SourceId { @@ -209,10 +205,10 @@ impl SourceId { self.inner.precise.as_ref().map(|s| s.as_slice()) } - pub fn with_precise(&self, v: String) -> SourceId { + pub fn with_precise(&self, v: Option) -> SourceId { SourceId { inner: Arc::new(SourceIdInner { - precise: Some(v), + precise: v, .. (*self.inner).clone() }), } diff --git a/src/cargo/core/summary.rs b/src/cargo/core/summary.rs index 04abb7eb8..4862572d5 100644 --- a/src/cargo/core/summary.rs +++ b/src/cargo/core/summary.rs @@ -1,11 +1,13 @@ use std::collections::HashMap; +use std::mem; use semver::Version; use core::{Dependency, PackageId, SourceId}; use util::{CargoResult, human}; -/// Subset of a `Manifest`. Contains only the most important informations about a package. +/// Subset of a `Manifest`. Contains only the most important informations about +/// a package. /// /// Summaries are cloned, and should not be mutated after creation #[deriving(Show,Clone)] @@ -89,6 +91,12 @@ impl Summary { pub fn get_features(&self) -> &HashMap> { &self.features } + + pub fn map_dependencies(mut self, f: |Dependency| -> Dependency) -> Summary { + let deps = mem::replace(&mut self.dependencies, Vec::new()); + self.dependencies = deps.into_iter().map(f).collect(); + self + } } impl PartialEq for Summary { diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 24baf7349..6d518380b 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -71,7 +71,7 @@ pub fn update_lockfile(manifest_path: &Path, match opts.precise { Some(precise) => { sources.push(dep.get_source_id().clone() - .with_precise(precise.to_string())); + .with_precise(Some(precise.to_string()))); } None => {} } diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index ace986918..d0234e3c4 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -7,7 +7,7 @@ use flate2::{GzBuilder, BestCompression}; use flate2::reader::GzDecoder; use core::source::{Source, SourceId}; -use core::{Package, MultiShell, Summary, Dependency}; +use core::{Package, MultiShell, Dependency}; use sources::PathSource; use util::{CargoResult, human, internal, ChainError, Require}; use ops; @@ -102,20 +102,12 @@ fn run_verify(pkg: &Package, shell: &mut MultiShell, tar: &Path) // implicitly converted to registry-based dependencies, so we rewrite those // dependencies here. let registry = try!(SourceId::for_central()); - let new_deps = pkg.get_dependencies().iter().map(|d| { - if !d.get_source_id().is_path() { return d.clone() } - Dependency::parse(d.get_name(), d.get_specified_req(), ®istry) - .unwrap() - .transitive(d.is_transitive()) - .features(d.get_features().to_vec()) - .default_features(d.uses_default_features()) - .optional(d.is_optional()) - }).collect::>(); - let new_summary = Summary::new(pkg.get_package_id().clone(), - new_deps, - pkg.get_summary().get_features().clone()); + let new_summary = pkg.get_summary().clone().map_dependencies(|d| { + if !d.get_source_id().is_path() { return d } + d.source_id(registry.clone()) + }); let mut new_manifest = pkg.get_manifest().clone(); - new_manifest.set_summary(new_summary.unwrap()); + new_manifest.set_summary(new_summary); let new_pkg = Package::new(new_manifest, &manifest_path, pkg.get_package_id().get_source_id()); diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 8938bac55..c2731fa78 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -176,7 +176,7 @@ impl<'a, 'b> Source for GitSource<'a, 'b> { try!(repo.copy_to(actual_rev.clone(), &self.checkout_path)); - let source_id = self.source_id.with_precise(actual_rev.to_string()); + let source_id = self.source_id.with_precise(Some(actual_rev.to_string())); let path_source = PathSource::new(&self.checkout_path, &source_id); self.path_source = Some(path_source); -- 2.30.2